package cache

import (
	"gitee.com/gousing/cache/storage"
	"gitee.com/gousing/values"
)

// GetFloat32 获取 float32 类型的缓存值, 如果不存在或已经过期则返回空值
//   - 支持自动转换类型: string, intX, uintX, floatX 以及实现了 values.FloatX 适配接口的类型
func GetFloat32(key string) float32 {
	val, _ := GetFloat32E(key)
	return val
}

// GetFloat32D 获取 float32 类型的缓存值, 如果不存在或已经过期则返回指定的 defaultVal 默认值
//   - 支持自动转换类型: string, intX, uintX, floatX 以及实现了 values.FloatX 适配接口的类型
func GetFloat32D(key string, defaultVal float32) float32 {
	val, err := GetFloat32E(key)
	if err != nil {
		return defaultVal
	}
	return val
}

// GetFloat32E 获取 float32 类型的缓存值, 如果不存在或已经过期则返回空值和错误信息
//   - 支持自动转换类型: string, intX, uintX, floatX 以及实现了 values.FloatX 适配接口的类型
func GetFloat32E(key string) (float32, error) {
	if key == "" {
		return 0, storage.ErrKeyIsEmpty
	}
	var val float32
	err := GetDefault().Scan(key, &val)
	if err == nil {
		return val, nil
	}
	// Key 不存在或已经过期
	if err == storage.ErrKeyNotExists {
		return 0, err
	}
	// Key 存在, 直接解码失败, 尝试类型转换
	anyVal, err := GetDefault().Get(key)
	if err != nil {
		return 0, err
	}
	return values.ToFloat32E(anyVal)
}

// GetFloat64 获取 float64 类型的缓存值, 如果不存在或已经过期则返回空值
//   - 支持自动转换类型: string, intX, uintX, floatX 以及实现了 values.FloatX 适配接口的类型
func GetFloat64(key string) float64 {
	val, _ := GetFloat64E(key)
	return val
}

// GetFloat64D 获取 float64 类型的缓存值, 如果不存在或已经过期则返回指定的 defaultVal 默认值
//   - 支持自动转换类型: string, intX, uintX, floatX 以及实现了 values.FloatX 适配接口的类型
func GetFloat64D(key string, defaultVal float64) float64 {
	val, err := GetFloat64E(key)
	if err != nil {
		return defaultVal
	}
	return val
}

// GetFloat64E 获取 float64 类型的缓存值, 如果不存在或已经过期则返回空值和错误信息
//   - 支持自动转换类型: string, intX, uintX, floatX 以及实现了 values.FloatX 适配接口的类型
func GetFloat64E(key string) (float64, error) {
	if key == "" {
		return 0, storage.ErrKeyIsEmpty
	}
	var val float64
	err := GetDefault().Scan(key, &val)
	return val, err
}
